#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
const int MAXN=305;
bool eq[MAXN][MAXN];
int dp[MAXN][MAXN];
string s[MAXN];
int main(void){
    int n;
    scanf("%d",&n);
    //空格数
    int allsum=n-1;
    for(int i=0;i<n;i++){
        cin >> s[i];
        allsum+=s[i].size();
    }
    for(int i=0;i<n;i++){
        //eq[i][j]表示字符串i j是否相等
        eq[i][i]=true;
        for(int j=0;j<i;j++){
            eq[i][j]=eq[j][i]=s[i]==s[j];
        }
    }
    for(int i=n-1;i>=0;i--){
        for(int j=n-1;j>=0;j--){
            //找最大公共子序列
            if(eq[i][j]){
                //dp[i][j]表示从i开始 和从j开始的相同子序列长度
                if(i<n-1 && j<n-1){
                    dp[i][j]=dp[i+1][j+1]+1;
                }
                //最后一个字符串的比较 循环开始
                else{
                    dp[i][j]=1;
                }
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            printf("%d ",dp[i][j]);
        }
        printf("\n");
    }
    int max_i=0;
    int max_j=0;
    int max_dp=0;
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(dp[i][j]<j-i-1){
                if(dp[i][j]>max_dp){
                    max_dp=dp[i][j];
                    max_i=i;
                    max_j=j;
                }
            }
        }
    }
    printf("%d %d %d\n",max_i,max_j,max_dp);
    int sum_t=0;
    for(int i=max_i;i<max_dp;i++){
        sum_t+=s[i].size();
        sum_t++;
    }
    sum_t--;
    sum_t-=max_dp;
    int ans=allsum-2*sum_t;
    printf("%d\n",ans);
    return 0;
}
